package quarto.view.server;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;

import quarto.Message;
import quarto.controller.server.Server;

/**
 * Grafische interface voor de server
 * @knows
 * - De server
 * @does
 * - Grafische representatie van de server toestand weergeven
 * @author Frank Bongonjen & Tim Smit
 */
public class ServerGUI extends JFrame implements ServerUI
{
    /** de server */
    private Server      server;
    
    /** het poortnummer */
    private int portNumber;
    
    /** de textarea voor de berichten */
    private JTextArea   TAMessages;
    
    /** scrolloppervlak voor het tekst veld */
    private JScrollPane SPMessages;
    
    /** locatie van het logo */
    public static final String SERVERIMAGE = "images/servergui_logo.jpg";
    
    /**
     * Construeert een ServerGUI object.
     */
    public ServerGUI() 
    {
        super(Message.SERVERGUI_TITLE);
        
        this.portNumber = -1;

        buildGUI();
        this.setVisible(true);

        this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        
        this.addWindowListener(new WindowAdapter()
        {
            // wordt het frame gesloten?
            @Override
            public void windowClosing(WindowEvent e)
            {
                // initialisatie
                int response = JOptionPane.YES_OPTION;

                // vragen op er gestopt moet worden
                response = JOptionPane.showConfirmDialog(
                    null,
                    Message.SERVERGUI_CONFIRM_CLOSE_MESSAGE,
                    Message.SERVERGUI_CONFIRM_CLOSE_TITLE,
                    JOptionPane.YES_NO_OPTION);

                // moet er gestopt worden
                if (response == JOptionPane.YES_OPTION)
                {
                    // om de games netjes af te sluiten
                    server.closeGames();
                    
                    // stoppen
                    System.exit(0);
                }
            }
        });
    }
    
    /**
     * Bouwt de GUI op met alle swing componenten
     */
    public void buildGUI()
    {
        // formaat achtergrond kleur en positie op het scherm
        this.setSize(350, 450);
        this.setBackground(new Color(255,255,255));
        this.setLocationRelativeTo(null);
        
        // de container waarin de componenten toegevoegd moeten worden
        Container c = this.getContentPane();
        
        // Label met daarin een plaatje aanmaken en toevoegen aan de container
        JLabel LBIcon = new JLabel(new ImageIcon(SERVERIMAGE));
        LBIcon.setBackground(new Color(255,255,255));
        LBIcon.setPreferredSize(new Dimension(300, 100));
        c.add(LBIcon, BorderLayout.NORTH);
        
        // TextArea aanmaken, in een ScrollPane zetten en toevoegen 
        // aan de container
        TAMessages = new JTextArea(Message.SERVERGUI_INIT);
        TAMessages.setLineWrap(true);
        TAMessages.setWrapStyleWord(true);
        SPMessages = new JScrollPane(TAMessages);
        c.add(SPMessages);
        
        // Maar als eerste het portnummer opvragen waarop de serversocket
        // moet gaan luisteren.
        do
        {
            this.askForConnect();
            // zodra we een portnummer hebben dan gaan we een server aanmaken
            // anders sluiten we de serverGUI af
            
            if (this.portNumber != -1)
            {
                try
                {
                    this.server = new Server(this.portNumber, this);
                    this.server.start();

                    Thread.sleep(500);
                }
                catch (InterruptedException ex) {}
            }
            else
            {
                System.exit(0);
            }
        }
        while (!this.server.connected());
    }
    
    /**
     * Vraagt de gebruiker om een poortnummer
     */
    private void askForConnect()
    {
        String portnumber;
        boolean error;
        do 
        {
            error = false;
            portnumber = JOptionPane.showInputDialog(
                null,
                Message.SERVERGUI_QUESTION_PORT_MESSAGE,
                Message.SERVERGUI_QUESTION_PORT_TITLE,
                JOptionPane.QUESTION_MESSAGE);
            
            try
            {
                this.portNumber = Integer.parseInt(portnumber);
            }
            // ongeldig poortnummer
            catch (NumberFormatException e)
            {
                this.portNumber = -1;
                
                // als er iets in ingevoerd, ofwel er is op 'verbinden' geklikt
                if (portnumber != null)
                {
                    error = true;
                    this.errorMessage(String.format(Message.SERVERGUI_PORT_ERROR, portnumber));
                }
            }
        }
        while (error);
    }
    
    /**
     * Voegt een bericht toe aan de TextArea met statusberichten
     * @param msg het bericht dat toegevoegd wordt
     */
    public void addMessage(String msg)
    {
        this.TAMessages.append("\n" + msg);
        this.TAMessages.setCaretPosition(this.TAMessages.getText().length());
    }
    
    /**
     * Geeft een melding van een fout in een popup window.
     * @param msg de melding van de fout
     */
    public void errorMessage(String msg)
    {
        JOptionPane.showMessageDialog(
            null,
            msg,
            Message.SERVERGUI_ERROR_TITLE,
            JOptionPane.ERROR_MESSAGE);
    }
    
    /**
     * Start het programma en maak een serverGUI aan
     * @param args
     */
    public static void main(String[] args)
    {
        new ServerGUI();
    }

}
